package com.zhang.common.core.utils.file;

import org.apache.poi.util.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;

/**
 * @Class com.zhang.common.core.utils.file
 * @Author zhang
 * @Date 2025/9/11 16:48
 * @Description 图片处理工具类
 **/
public class ImageUtils {

    /**
     * 日志打印
     */
    private static final Logger log = LoggerFactory.getLogger(ImageUtils.class);

    /**
     * 获取指定路径下的图片, 并转为对应的二进制数据流
     *
     * @param imagePath 图片的指定路径
     * @return 返回指定图片的二进制数据流
     */
    public static byte[] getImage(String imagePath) {
        // 获取图片, 转为流对象
        InputStream is = getFile(imagePath);
        try {
            // 流对象判空
            assert is != null;
            // 转为二进制数据集
            return IOUtils.toByteArray(is);
        } catch (Exception e) {
            log.error("图片加载异常 {}", e.getMessage(), e);
            return null;
        } finally {
            IOUtils.closeQuietly(is);
        }
    }

    /**
     * 获取指定路径下图片并转为流对象
     *
     * @param imagePath 指定图片路径
     * @return 返回对应的流对象
     */
    public static InputStream getFile(String imagePath) {
        try {
            // 读取路径下文件的二进制数据集
            byte[] result = readFile(imagePath);
            // 判空
            assert result != null;
            // 获取复制对象
            result = Arrays.copyOf(result, result.length);
            return new ByteArrayInputStream(result);
        } catch (Exception e) {
            log.error("获取图片异常 {}", e.getMessage(), e);
        }
        return null;
    }

    /**
     * 读取文件为字节数据
     *
     * @param url 具体的路径地址
     * @return 字节数据
     */
    public static byte[] readFile(String url) {
        InputStream in = null;
        try {
            // 网络地址
            URL urlObj = new URL(url);
            // 打开链接
            URLConnection urlConnection = urlObj.openConnection();
            // 设置超时时间
            urlConnection.setConnectTimeout(30 * 1000);
            // 设置读取时间
            urlConnection.setReadTimeout(60 * 1000);
            // 允许输入
            urlConnection.setDoInput(true);
            // 获取对应的输入流
            in = urlConnection.getInputStream();
            return IOUtils.toByteArray(in);
        } catch (Exception e) {
            log.error("访问文件异常 {}", e.getMessage(), e);
            return null;
        } finally {
            IOUtils.closeQuietly(in);
        }
    }
}
